Amazon CloudFront・Application Load Balancer(ALB)間の通信をHTTPS化してみた
HTTPSでApplication Load Balancerにアクセスしたい
おのやんです。
みなさん、Application Load Balancer(以下、ALB)をAmazon CloudFront(以下、CloudFront)のオリジンとして設定する時に、HTTPSで通信したいと思ったことはありませんか?私はあります。
CloudFrontのオリジンとしてALBを設定する際に、クライアント <=> CloudFrontの間や、CloudFront <=> ALBの通信をHTTPSに対応させたい場合があります。そういった際に必要な手順をまとめましたので、本記事ではそちらを紹介します。
目指す構成
今回は、EC2やALBがこちらの構成であらかじめ構築されているものとして進めます。
具体的に言うと、2つのAZにパブリックサブネットとプライベートサブネットを作成し、パブリックサブネットにはALBを、プライベートサブネットにはEC2インスタンスを起動しています。このEC2インスタンスにはApacheのWebサーバーが設定されており、Internat gatewayを通してApacheのページにアクセスできるようになっています。この際、通信はすべてHTTPとなっています。
実際にWebブラウザからALBのドメインにアクセスすると、このようにApacheのデフォルトページが表示されることが分かります。この画像ではWebブラウザとしてChromeを使っているのですが、通信がHTTPSになっていないため、保護されていない通信
と表示されているのも確認できます。
この環境に対して、CloudFrontやAmazon Route 53(以下、Route 53)のパブリックホストゾーンを追加で作成します。その後AWS Certificate Manager(以下、ACM)にて証明書を発行し、この証明書を使ってクライアントとCloudFront間、CloudFrontとALB間の通信をHTTPSにします。またこの設定に際して、CloudFrontディストリビューションにドメインを紐付け、独自ドメインでアクセスできるようにします。
ACM証明書の発行
まず初めに、HTTPS化で使用するACMの証明書を発行します。
ここで注意なのですが、ACM証明書は東京リージョン(ap-northeast-1)とバージニア北部(us-east-1)の2リージョンで作成します。東京リージョンで発行したACMはALBに用いるのですが、バージニア北部リージョンで発行したACM証明書はCloudFrontディストリビューションに使用します。
CloudFront で ACM 証明書を使用するには、米国東部 (バージニア北部) リージョン (us-east-1) の証明書をリクエスト (またはインポート) していることを確認します。
そのため、ACM証明書発行作業は東京リージョンとバージニア北部リージョンの2つで発行します。
まず、東京リージョンにてACM証明書を発行します。リージョン選択部分が東京になっていることを確認した状態で、ACM証明書画面の「リクエスト」ボタンを押下します。
証明書タイプはパブリック証明書のままでOKですので、このまま次に進みます。
ドメイン名の例として、今回はexample.com
を例に出します。また、example.com
はRoute 53のパブリックホストゾーンにて管理されているとします。
今回はCloudFrontにサブドメインを充てる予定はありませんが、念の為example.com
のドメイン名のほかに、サブドメインを許可する*.example.com
を追加しておきます。
あとはデフォルトの設定で大丈夫ですので、そのまま証明書をリクエストします。
正常に証明書が発行できれば、このように証明書の詳細画面が確認できるようになります。ここで「ドメイン」セクションの「Route 53でレコードを作成」ボタンを押下します。
パブリックホストゾーンに追加するレコードがあらかじめ作成され選択されている状態のため、このまま「レコードを作成」を押下します。
証明書のステータスが「発行済み」に、ドメインのステータスが「成功」になれば、証明書が有効になっています。
これで東京リージョンでの証明書発行は完了です。同様の手順をバージニア北部リージョンでも実施し、有効な証明書を発行しておきましょう。
CloudFrontディストリビューションの作成
ACMの証明書が発行されたら、次にCloudFrontディストリビューションを作成します。
CloudFrotディストリビューション作成画面にて、ALBをオリジンとして設定します。また、今回はCloudFrontとALBの間の通信はHTTPS化したいので、プロトコルは「HTTPSのみ」を選択します。
またRoute 53で管理しているドメインでアクセスしたいため、代替ドメイン名としてexapmle.com
を入力しておきます。
またCustom SSL certificateの部分では、バージニア北部リージョンで発行したACM証明書が選択できますので、そちらを設定します。
その他のキャッシュビヘイビアやキャッシュキー・オリジンリクエストは自由に設定してもらって、CloudFrontディストリビューションを作成します。
このCloudFrontディストリビューションにドメインを設定するRoute 53レコードを作成します。レコード作成時の設定は以下の通りです。
項目 | 設定値 | 備考 |
---|---|---|
レコード名 | _(空白) | ドメインをそのまま使用します |
レコードタイプ | A | |
エイリアス | 有効 | |
トラフィックのルーティング先 | CloudFrontディストリビューションへのエイリアス 上記で作成したCloudFrontディストリビューション |
ALBのリスナーを編集
最後に、ALBのリスナーを編集します。ロードバランサー画面でALBを選択すると、画面下部にALBの詳細設が表示されます。ここのリスナーとルールタブからリスナーが選択できます。冒頭で紹介したALBの動作確認からも分かる通り、現在はHTTPでのアクセスがリスナーで設定されています。こちらをHTTPSに変更したいと思います。
リスナー部分の「HTTP:80」を押下して、リスナー詳細画面に移動します。
リスナー詳細画面では「アクション」トグルの「リスナーの編集」から編集できるので、こちらを押下します。
「リスナーの詳細」のセクションにて、プロトコルを設定できます。現在はリスナーのプロトコルがHTTPになっているため、ここをHTTPS・ポート443に変更します。
HTTPSを選択したことにより、セキュアリスナーの設定項目が表示されるようになります。証明書の取得先はACMからに設定して、東京リージョンで発行したACM証明書を選択します。これらの設定が完了したら「変更内容の保存」を謳歌します。
リスナーがHTTPSになったことで、このようにプロトコルが変更されました。
実際にexample.com
でWebブラウザからアクセスしてみると、Apacheのテストページが表示されるのが確認できます。またChromeを使用している場合、HTTPSでアクセスしている時は保護されていない通信
が表示されなくなります。
HTTPS化には、CloudFrontとALBリスナーにて証明書の設定が必要
CloudFrontとALBでそれぞれ別リージョンのACM証明書が必要ですので、ここは注意するようにしてください。別リージョンのACM証明書を取得できたら、あとはCloudFrontとALBリスナーの両方でそれぞれ証明書を設定すればOKです。
今回の記事が参考になれば幸いです。では!